<!DOCTYPE html>
<html lang="zh">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    
<!-- 
    函数：封装了某种功能，可控制执行，可重复调用的代码块
    声明函数：使用function关键字，后面跟参数和函数体
    function test(形参){函数体}
    调用函数：test(实参);
    函数的参数：
        形参，定义函数时写的参数，相当于函数内部的变量
        实参，调用函数时传递的参数，是一个具体的值，和形参一一对应
        函数内部可以使用arguments接收到所有的实参
    函数的属性：
        name属性返回函数的名称
        length属性返回形参的个数
    函数的返回值：
        每一个函数都有返回值，默认为undefined
        可以使用return自定义函数的返回值
        注意：return后面的程序不会执行
    ECMA内置函数：
        Number()
        String()
        parseInt()
        ...
    自定义函数的分类：
        函数声明 function fn(){} 可以在声明之前或之后调用
        函数表达式 var fn = function (){} 只能在声明之后调用
        匿名函数 function (){} 不允许单独定义
    
    作用域：程序中某个名字起作用域的范围
    两种作用域：全局作用域和局部作用域（函数作用域）
    全局作用域：页面中整个script标签内
        在全局作用域不能访问局部作用域中的变量函数
        全局作用域中有一个全局对象window
        在全局声明的变量和函数添加到window对象中
    局部作用域：函数内部，JS中函数是唯一拥有自身作用域的代码块
        局部作用域中可以访问全局的变量或函数

    局部作用域中的变量可以和全局作用域中的变量重名
    变量和函数重名，函数优先使用该名字
    形参和局部变量重名，形参优先使用该名字
    可以直接给未声明的变量赋值（隐式声明，前提是整个作用域链都没有）
    
    声明提升机制
        在JS中变量声明或函数声明时，'声明'会提升到当前作用域顶部
        fun();
        console.log(abc);
        var abc = 123;
        function fun(){}
        提升之后：
        var abc;
        function fun(){}
        fun();
        console.log(abc);
        abc = 123;

    浏览器的JS引擎主要负责解析并执行JS代码
    当一段代码要执行时，先 预解析代码，再 逐行执行代码

    作用域链：本质上是一个指向变量对象的指针列表 
    [当前函数的变量对象，上层执行上下文的变量对象，...，全局执行上下文的变量对象]
    作用域链用于变量或函数的查找，先在当前作用域查找，如果没有，则向上层作用域查找
 -->

<script>
// 全局作用域
</script>
</body>
</html>